cssimage: Get rid of draw vfunc
authorBenjamin Otte <otte@redhat.com>
Wed, 14 Feb 2018 01:30:42 +0000 (02:30 +0100)
committerBenjamin Otte <otte@redhat.com>
Sat, 17 Feb 2018 07:04:43 +0000 (08:04 +0100)
All remaining users of that vfunc now implement snapshot using cairo
render nodes (win32 and radial).

Also, GtkCssImageClass.snapshot is now NULL, so if a subclass doesn't
implement it, it will now crash.
Previously it would try to call the draw vfunc.

gtk/gtkcssimage.c
gtk/gtkcssimagebuiltin.c
gtk/gtkcssimageprivate.h
gtk/gtkcssimageradial.c
gtk/gtkcssimagewin32.c

index 7ce0f0a7e2a363b8cad208d71e622417bc123ef3..665ef93c47c5297f1fe51224bcd9873fdfac452d 100644 (file)
@@ -96,45 +96,6 @@ gtk_css_image_real_transition (GtkCssImage *start,
     return _gtk_css_image_cross_fade_new (start, end, progress);
 }
 
-static void
-gtk_css_image_real_draw (GtkCssImage *image,
-                         cairo_t     *cr,
-                         double       width,
-                         double       height)
-{
-  GtkSnapshot snapshot;
-  GskRenderNode *node;
-  cairo_region_t *clip;
-
-  clip = cairo_region_create_rectangle (&(cairo_rectangle_int_t) { 0, 0, width, height });
-  gtk_snapshot_init (&snapshot, NULL, FALSE, clip, "Fallback<%s>", G_OBJECT_TYPE_NAME (image));
-  gtk_css_image_snapshot (image, &snapshot, width, height);
-  node = gtk_snapshot_finish (&snapshot);
-
-  if (node != NULL)
-    {
-      gsk_render_node_draw (node, cr);
-      gsk_render_node_unref (node);
-    }
-
-  cairo_region_destroy (clip);
-}
-
-static void
-gtk_css_image_real_snapshot (GtkCssImage *image,
-                             GtkSnapshot *snapshot,
-                             double       width,
-                             double       height)
-{
-  cairo_t *cr;
-
-  cr = gtk_snapshot_append_cairo (snapshot,
-                                  &GRAPHENE_RECT_INIT (0, 0, width, height),
-                                  "Fallback<%s>", G_OBJECT_TYPE_NAME (image));
-  _gtk_css_image_draw (image, cr, width, height);
-  cairo_destroy (cr);
-}
-
 static void
 _gtk_css_image_class_init (GtkCssImageClass *klass)
 {
@@ -144,8 +105,6 @@ _gtk_css_image_class_init (GtkCssImageClass *klass)
   klass->compute = gtk_css_image_real_compute;
   klass->equal = gtk_css_image_real_equal;
   klass->transition = gtk_css_image_real_transition;
-  klass->draw = gtk_css_image_real_draw;
-  klass->snapshot = gtk_css_image_real_snapshot;
 }
 
 static void
@@ -260,7 +219,9 @@ _gtk_css_image_draw (GtkCssImage        *image,
                      double              width,
                      double              height)
 {
-  GtkCssImageClass *klass;
+  GtkSnapshot snapshot;
+  GskRenderNode *node;
+  cairo_region_t *clip;
 
   g_return_if_fail (GTK_IS_CSS_IMAGE (image));
   g_return_if_fail (cr != NULL);
@@ -269,9 +230,18 @@ _gtk_css_image_draw (GtkCssImage        *image,
 
   cairo_save (cr);
 
-  klass = GTK_CSS_IMAGE_GET_CLASS (image);
+  clip = cairo_region_create_rectangle (&(cairo_rectangle_int_t) { 0, 0, width, height });
+  gtk_snapshot_init (&snapshot, NULL, FALSE, clip, "Fallback<%s>", G_OBJECT_TYPE_NAME (image));
+  gtk_css_image_snapshot (image, &snapshot, width, height);
+  node = gtk_snapshot_finish (&snapshot);
+
+  if (node != NULL)
+    {
+      gsk_render_node_draw (node, cr);
+      gsk_render_node_unref (node);
+    }
 
-  klass->draw (image, cr, width, height);
+  cairo_region_destroy (clip);
 
   cairo_restore (cr);
 }
index fe15fb183f3a8b2c40d103a647c97a263c8b4e40..aedc2e8ff52af2656277bd828af05e9a1cb721be 100644 (file)
@@ -444,10 +444,10 @@ gtk_css_image_builtin_draw_spinner (GtkCssImage *image,
 }
 
 static void
-gtk_css_image_builtin_real_draw (GtkCssImage        *image,
-                                 cairo_t            *cr,
-                                 double              width,
-                                 double              height)
+gtk_css_image_builtin_real_snapshot (GtkCssImage *image,
+                                     GtkSnapshot *snapshot,
+                                     double       width,
+                                     double       height)
 {
   /* It's a builtin image, other code will draw things */
 }
@@ -516,7 +516,7 @@ gtk_css_image_builtin_class_init (GtkCssImageBuiltinClass *klass)
   GtkCssImageClass *image_class = GTK_CSS_IMAGE_CLASS (klass);
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
-  image_class->draw = gtk_css_image_builtin_real_draw;
+  image_class->snapshot = gtk_css_image_builtin_real_snapshot;
   image_class->parse = gtk_css_image_builtin_parse;
   image_class->print = gtk_css_image_builtin_print;
   image_class->compute = gtk_css_image_builtin_compute;
index 9fc962df28ea2ff841d52a06b6b50053f5e26d57..e4b06e2e759985be1cb5a40f2eeae87874ff7791 100644 (file)
@@ -71,10 +71,6 @@ struct _GtkCssImageClass
                                                     double                      progress);
 
   /* draw to 0,0 with the given width and height */
-  void         (* draw)                            (GtkCssImage                *image,
-                                                    cairo_t                    *cr,
-                                                    double                      width,
-                                                    double                      height);
   void         (* snapshot)                        (GtkCssImage                *image,
                                                     GtkSnapshot                *snapshot,
                                                     double                      width,
index 0afd43040fa110399c2af4f087d8497716ece856..88a03570229cd9dafb7f17283037da3cdd7d80ae 100644 (file)
@@ -74,10 +74,10 @@ gtk_css_image_radial_get_start_end (GtkCssImageRadial *radial,
 }
 
 static void
-gtk_css_image_radial_draw (GtkCssImage *image,
-                           cairo_t     *cr,
-                           double       width,
-                           double       height)
+gtk_css_image_radial_snapshot (GtkCssImage *image,
+                               GtkSnapshot *snapshot,
+                               double       width,
+                               double       height)
 {
   GtkCssImageRadial *radial = GTK_CSS_IMAGE_RADIAL (image);
   cairo_pattern_t *pattern;
@@ -88,6 +88,11 @@ gtk_css_image_radial_draw (GtkCssImage *image,
   double r1, r2, r3, r4, r;
   double offset;
   int i, last;
+  cairo_t *cr;
+
+  cr = gtk_snapshot_append_cairo (snapshot,
+                                  &GRAPHENE_RECT_INIT (0, 0, width, height),
+                                  "Fallback<%s>", G_OBJECT_TYPE_NAME (image));
 
   x = _gtk_css_position_value_get_x (radial->position, width);
   y = _gtk_css_position_value_get_y (radial->position, height);
@@ -225,6 +230,8 @@ gtk_css_image_radial_draw (GtkCssImage *image,
   cairo_fill (cr);
 
   cairo_pattern_destroy (pattern);
+
+  cairo_destroy (cr);
 }
 
 static gboolean
@@ -667,7 +674,7 @@ _gtk_css_image_radial_class_init (GtkCssImageRadialClass *klass)
   GtkCssImageClass *image_class = GTK_CSS_IMAGE_CLASS (klass);
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
-  image_class->draw = gtk_css_image_radial_draw;
+  image_class->snapshot = gtk_css_image_radial_snapshot;
   image_class->parse = gtk_css_image_radial_parse;
   image_class->print = gtk_css_image_radial_print;
   image_class->compute = gtk_css_image_radial_compute;
index d03fababcd792ac49ea3bd0295b5d741c9aea4dd..29eb13e6500ecaa2e727cc47df3b13dbef3933ee 100644 (file)
 G_DEFINE_TYPE (GtkCssImageWin32, _gtk_css_image_win32, GTK_TYPE_CSS_IMAGE)
 
 static void
-gtk_css_image_win32_draw (GtkCssImage        *image,
-                          cairo_t            *cr,
-                          double              width,
-                          double              height)
+gtk_css_image_win32_snapshot (GtkCssImage *image,
+                              GtkSnapshot *snapshot,
+                              double       width,
+                              double       height)
 {
   GtkCssImageWin32 *wimage = GTK_CSS_IMAGE_WIN32 (image);
   cairo_surface_t *surface;
   int dx, dy;
+  cairo_t *cr;
+
+  cr = gtk_snapshot_append_cairo (snapshot,
+                                  &GRAPHENE_RECT_INIT (0, 0, width, height),
+                                  "Fallback<%s>", G_OBJECT_TYPE_NAME (image));
 
   surface = gtk_win32_theme_create_surface (wimage->theme, wimage->part, wimage->state, wimage->margins,
                                            width, height, &dx, &dy);
@@ -63,6 +68,8 @@ gtk_css_image_win32_draw (GtkCssImage        *image,
   cairo_fill (cr);
 
   cairo_surface_destroy (surface);
+
+  cairo_destroy (cr);
 }
 
 static gboolean
@@ -242,7 +249,7 @@ _gtk_css_image_win32_class_init (GtkCssImageWin32Class *klass)
 
   object_class->finalize = gtk_css_image_win32_finalize;
 
-  image_class->draw = gtk_css_image_win32_draw;
+  image_class->snapshot = gtk_css_image_win32_snapshot;
   image_class->parse = gtk_css_image_win32_parse;
   image_class->print = gtk_css_image_win32_print;
 }